package marja;
import java.util.ArrayList;

import steffen.WSVException;

/**
 * Die Klasse KundenArchiv stellt eine Schnittstelle zur Klasse Kunde da
 * Über diese Klassen können neue Kunden erzeugt und bestehende geändert werden
 * 
 * @author Marja Ahlbrand
 *
 */
public class KundenArchiv
{
    ArrayList<Kunde> kundendaten = new ArrayList<Kunde>();
    
    /**
     * legt fest das nur eine Instanz von KundenArchiv erzeugt werden kann
     */
    private static KundenArchiv kundenarchiv = new KundenArchiv();
    
    /**
     * die Methode getInstance gibt eine Instanz vom KundenArchiv zurück
     * @return Instanz vom KundenArchiv
     */
    public static KundenArchiv getInstance()
    {
        return kundenarchiv;
    }
    
    
    /**
     * fügt einen Kunden in die Kundendatei kundendaten hinzu und findet eine eindeutige Kundennummer
     * @param vorname
     * @param nachname
     * @return true wenn das Hinzufügen erfolgreich war
     * @throws WSVException 
     */
    public void fügeKundeHinzu(String vorname, String nachname) throws WSVException
    {
        vorname = vorname.trim();
        nachname = nachname.trim();
        if(!gültigerName(vorname))
        {
            throw new WSVException("Kein gültiger Vorname angegeben", 69);
        }
        if(!gültigerName(nachname))
        {
            throw new WSVException("Kein gültiger Nachname angegeben", 68);
        }
        if(prüfeNameSchonVorhanden(vorname, nachname))
        {
            throw new WSVException("Kundenname schon vorhanden",65);
        }
        Kunde kunde;
        if(!prüfeZulässigeKundennummerNeu(kundendaten.size()))
        {
            int kundennummer = kundendaten.size();
            do{
                kundennummer++;
            }while(!prüfeZulässigeKundennummerNeu(kundennummer));
            kunde = new Kunde(kundennummer, vorname, nachname);
        }else
        {
            kunde = new Kunde(vorname, nachname);
        }
        kundendaten.add(kunde);
        System.out.println("Kunde " + kunde.getVorname() + " " + kunde.getNachname() + " wurde angelegt mit Kundennummer " + kunde.getKundennummer() + ".");
    }
    
    /**
     * prüft ob der Vor- und Nachname schon vorhanden sind
     * @param vorname
     * @param nachname
     * @return true wenn der Name schon vorhanden ist
     */
    private boolean prüfeNameSchonVorhanden(String vorname, String nachname)
    {
        for(int i=0; i < kundendaten.size();i++)
        {
            if(kundendaten.get(i).getNachname().equalsIgnoreCase(nachname) &&
                    kundendaten.get(i).getVorname().equalsIgnoreCase(vorname) )
            {
                return true;
            }
        }
        return false;
    }
    
    /**
     * fügt einen Kunden in die Kundendatei kundendaten hinzu und überprüft mit prüfeZulässigeKundennummer
     * ob die gewünschte Kundennummer noch zu vergeben ist
     * @param kundennummer
     * @param vorname
     * @param nachname
     * @return false wenn die Kundennummer schon vergeben ist
     * @throws WSVException 
     */
    public void fügeKundeHinzu(int kundennummer, String vorname, String nachname) throws WSVException
    {
        vorname = vorname.trim();
        nachname = nachname.trim();
        if(!gültigerName(vorname))
        {
            throw new WSVException("Kein gültiger Vorname angegeben", 69);
        }
        if(!gültigerName(nachname))
        {
            throw new WSVException("Kein gültiger Nachname angegeben", 68);
        }
        if(prüfeNameSchonVorhanden(vorname, nachname))
        {
            throw new WSVException("Kundenname schon vorhanden",65);
        }
        if(prüfeZulässigeKundennummerNeu(kundennummer))
        {
            Kunde kunde = new Kunde(kundennummer, vorname, nachname);
            kundendaten.add(kunde); 
            System.out.println("Kunde " + kunde.getVorname() + " " + kunde.getNachname() + " wurde angelegt mit Kundennummer " + kunde.getKundennummer() + ".");
        }else
        {
             throw new WSVException("Kundennummer schon vorhanden",66);
        }
       
    }
    
    
    /**
     * sucht einen spezifischen Kunden anhand einer Kundennummer
     * @param kundennummer
     * @return gibt das entsprechende Kundenobjekt zurück
     */
    private Kunde findeKundeMitKundennummer(int kundennummer)
    {
        for(int i=0; i < kundendaten.size();i++)
        {
            if(kundendaten.get(i).getKundennummer()==kundennummer)
            {
                return kundendaten.get(i);
            }
        }
        return null;
    }
    
    /**
     * 
     * @param vorname
     * @param nachname
     * @return
     */
    private Kunde findeKundeMitName(String vorname, String nachname)
    {
        for(int i=0; i < kundendaten.size();i++)
        {
            if(kundendaten.get(i).getVorname().equalsIgnoreCase(vorname) && kundendaten.get(i).getNachname().equalsIgnoreCase(nachname))
            {
                return kundendaten.get(i);
            }
        }
        return null;
    }
    
    /**
     * ändert den Vornamen von einem Kunden
     * @param kundennummer
     * @param neuerVorname
     * @return true wenn die Änderung des Namen erfolgreich war, false wenn der Kunde anhand der Kundennummer nicht gefunden worden ist oder der Name nicht mehr eindeutig ist
     * @throws WSVException 
     */
    public void ändernVonVorname(int kundennummer, String neuerVorname) throws WSVException
    {
        neuerVorname = neuerVorname.trim();
        if(!gültigerName(neuerVorname))
        {
            throw new WSVException("Kein gültiger Vorname angegeben", 69);
        }

        Kunde kunde = findeKundeMitKundennummer(kundennummer);
        if (kunde == null)
        {
            throw new WSVException("Kunde nicht vorhanden",67);
        }
        if(prüfeNameSchonVorhanden(neuerVorname, kunde.getNachname()))
        {
            throw new WSVException("Kundenname schon vorhanden",65);
        }
        String alterVorname = kunde.getVorname();
        kunde.setVorname(neuerVorname);
        System.out.println("Der Name wurde von "+alterVorname+" "+kunde.getNachname()+
                " auf "+kunde.getVorname()+" "+kunde.getNachname()+" geändert.");
        
    }
    
    /**
     * ändert den Nachnamen von einem Kunden
     * @param kundennummer
     * @param neuerNachname
     * @return true wenn die Änderung des Namen erfolgreich war, false wenn der Kunde anhand der Kundennummer nicht gefunden worden ist oder der Name nicht mehr eindeutig ist
     * @throws WSVException 
     */
    public void ändernVonNachname(int kundennummer, String neuerNachname) throws WSVException
    {
        
        neuerNachname = neuerNachname.trim();
 
        if(!gültigerName(neuerNachname))
        {
            throw new WSVException("Kein gültiger Nachname angegeben", 68);
        }
        Kunde kunde = findeKundeMitKundennummer(kundennummer);
        if (kunde == null)
        {
            throw new WSVException("Kunde nicht vorhanden",67);
        } 
        if(prüfeNameSchonVorhanden(kunde.getVorname(), neuerNachname))
        {
            throw new WSVException("Kundenname schon vorhanden",65);
        }
        String alterNachname = kunde.getNachname();
        kunde.setNachname(neuerNachname);
        System.out.println("Der Name wurde von "+kunde.getVorname()+" "+alterNachname+
                " auf "+kunde.getVorname()+" "+kunde.getNachname()+" geändert.");
    }
    
    /**
     * ändert die Kundennummer von einem Kunden
     * @param alte Kundennummer
     * @param neue Kundennummer
     * @return true wenn die Änderung der Kundennummer erfolgreich war, false wenn der Kunde anhand der alten Kundennummer nicht gefunden worden ist
     * @throws WSVException 
     */
    public void ändernVonKundennummer(int alteKundennummer, int neueKundennummer) throws WSVException
    {
        Kunde kunde = findeKundeMitKundennummer(alteKundennummer);
        
        if (kunde == null)
        {
            throw new WSVException("Kunde nicht vorhanden",67);
        }
        if(prüfeZulässigeKundennummerÄndern(alteKundennummer, neueKundennummer, kunde))
        {
            kunde.setKundennummer(neueKundennummer);
            System.out.println("Die Kundennummer wurde für den Kunden "+ kunde.getVorname()+" "+kunde.getNachname()+
                " von "+alteKundennummer+ " auf "+neueKundennummer+" geändert.");
        }else
        {
            throw new WSVException("Kundennummer schon vorhanden", 66);
        }
    }
    
    /**
     * prüft ob die Kundennummer zu der gewünschten geändert werden kann
     * @param alteKundennummer
     * @param neueKundennummer
     * @return true wenn die neue Kundennummer zulässig ist
     */
    private boolean prüfeZulässigeKundennummerÄndern(int alteKundennummer, int neueKundennummer, Kunde kunde)
    {
        for (int i = 0; i < kundendaten.size(); i++)
        {
            if ((kundendaten.get(i).getKundennummer() == neueKundennummer) &&
                    (kundendaten.get(i).getKundennummer() != alteKundennummer))
            {
                return false;
            }
        }
        return true;
    }
    
    /**
     * prüft ob eine Kundennummer zulässig ist beim Neuerstellen
     * @param neueKundennummer
     * @return true wenn die Kundennummer zulässig ist
     */
    private boolean prüfeZulässigeKundennummerNeu(int neueKundennummer)
    {
        for (int i = 0; i < kundendaten.size(); i++)
        {
            if (kundendaten.get(i).getKundennummer() == neueKundennummer)
            {
                return false;
            }
        }
        return true;
    }
    
    /**
     * 
     * @param kundennummer
     * @return Kundenindex
     * @throws WSVException 
     */
    public int bekommeIndex(int kundennummer) throws WSVException
    {
        Kunde kunde = findeKundeMitKundennummer(kundennummer);
        if(kunde == null)
        {
            //Kunde nicht vorhanden
            throw new WSVException("Kunde nicht vorhanden",67);
        }
        return kunde.getKundenindex();
    }
    
    /**
     * 
     * @param vorname
     * @param nachname
     * @return Kundenindex
     * @throws WSVException 
     */
    public int bekommeIndex(String vorname, String nachname) throws WSVException
    {
        vorname=vorname.trim();
        nachname = nachname.trim();
        Kunde kunde = findeKundeMitName(vorname, nachname);
        if(kunde== null)
        {
            //Kunde nicht vorhanden
            throw new WSVException("Kunde nicht vorhanden",67);
        }
        return kunde.getKundenindex();
    }
    

    /**
     * 
     * @param index
     * @return Kundennummer
     */
    public int bekommeKundennummer(int index)
    {
        return kundendaten.get(index).getKundennummer();
    }
    
    /**
     * 
     * @param index
     * @return Vorname
     */
    public String bekommeVorname(int index)
    {
        return kundendaten.get(index).getVorname();
    }
    
    /**
     * 
     * @param index
     * @return Nachname
     */
    public String bekommeNachname(int index)
    {
        return kundendaten.get(index).getNachname();
    }
    
    /**
     * Gibt alle vorhandenen Kunden aus
     */
    public void gebeKundenAus()
    {
        if(kundendaten.size()>0)
        {
            System.out.println("KdNr.\tKundenname");
            System.out.println("---------------------------------");
            for(int i =0; i<kundendaten.size(); i++)
            {
                System.out.println(kundendaten.get(i).getKundennummer()+"\t"
                        +kundendaten.get(i).getVorname()+" "+kundendaten.get(i).getNachname());
            }
        }else
        {
            System.out.println("Es sind noch keine Kunden angelegt worden.");
        }
        System.out.println();
  
    }
    
    /**
     * Prüft ob ein Name übergeben wurde
     * @param name
     * @return false wenn der Name leer ist, true wenn der Name als gültig erkannt wird
     */
    private boolean gültigerName(String name)
    {
        if(name.length()==0)
            return false;
        return true;
    }
}
